// use sea_orm::entity::prelude::*;
use chrono::{NaiveDateTime};
// use sea_orm::{ActiveModelBehavior, DeriveEntityModel, DeriveRelation, EnumIter, Related, RelationDef, RelationTrait};
use rust_decimal::Decimal;
use sea_orm::entity::prelude::*;
use serde::{Deserialize, Serialize};

// Model 用于存储查询结果的 Rust 结构体
// DeriveEntityModel 宏完成了定义实体与关联模型、列和主键的所有繁重工作。
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Serialize, Deserialize)]
#[sea_orm(table_name = "t_user")]
pub struct Model {
    #[sea_orm(primary_key)]
    pub id: u32,
    pub name: String,
    pub password: String,
    pub age: u32,
    #[sea_orm(column_type = "Double")]
    pub score: f64,
    pub gender: bool,
    pub price: Decimal,
    #[sea_orm(column_type = "DateTime", nullable)]
    pub create_time: Option<NaiveDateTime>,
    #[sea_orm(column_type = "DateTime", nullable)]
    pub update_time: Option<NaiveDateTime>,
}

// Relation 指定与其他实体的关系
// 此处相当与实体组合，表示本实体模型依赖一个外部实体模型Fruit，其中has_many表示以来的子模型位置，super表示当前模型所在目录
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {
    // #[sea_orm(has_many = "super::blog::Entity")]
    // Blog,
}

// Related 定义特征边界可以帮助您一起查询相关实体，特别是在多对多关系中很有帮助。
// impl Related<super::blog::Entity> for Entity {
//     fn to() -> RelationDef {
//         Relation::Blog.def()
//     }
// }

// ActiveModel 具有其对应模型的所有属性，但所有属性都包装在 ActiveValue 中。
// ActiveModel 上不同操作的钩子。例如，可以执行自定义验证逻辑或触发副作用。在事务中，您甚至可以在操作完成后中止操作，从而防止其保存到数据库中。相当与Java中的Service或者Mapper接口实现类
impl ActiveModelBehavior for ActiveModel {}

// 不要删除关系枚举（Relation）或活动模型行为（ActiveModelBehavior） impl 块，即使它们是空的。
